package org.liaohailong.library.image

import android.content.Context
import android.graphics.drawable.Drawable
import android.widget.ImageView

/**
 * Author: liaohailong
 * Date: 2019/3/7
 * Time: 9:34 PM
 * Description: 网络图片请求工具类
 **/
class ImageLoader private constructor() {

    companion object {
        val INSTANCE: ImageLoader = ImageLoader()

        const val DEFAULT_WIDTH = 720
        const val DEFAULT_HEIGHT = 1280
    }

    private val imageEngine: ImageEngine = ImageEngineFactory.create(ImageEngineFactory.Type.Glide)

    /**
     * 列表中加载图片优化
     * perform 表示当前列表是否处于滑动状态
     * true 表示列表正在滑动，设置挂载图即可
     * false 表示列表处于静止，请求内容图片
     *
     * @param imageView 图片控件
     * @param url 图片地址
     * @param placeHolderResId 请求中挂载图资源id
     * @param perform 列表是否正在执行滑动任务
     */
    fun performImage(imageView: ImageView, url: String, placeHolderResId: Int, perform: Boolean) {
        if (perform) {
            if (placeHolderResId > 0) imageView.setImageResource(placeHolderResId)
        } else {
            setImage(imageView, url, placeHolderResId, null)
        }
    }

    /**
     * 列表中加载图片优化
     * perform 表示当前列表是否处于滑动状态
     * true 表示列表正在滑动，设置挂载图即可
     * false 表示列表处于静止，请求内容图片
     *
     * @param imageView 图片控件
     * @param url 图片地址
     * @param placeHolder 请求中挂载图
     * @param perform 列表是否正在执行滑动任务
     */
    fun performImage(imageView: ImageView, url: String, placeHolder: Drawable?, perform: Boolean) {
        if (perform) {
            imageView.setImageDrawable(placeHolder)
        } else {
            setImage(imageView, url, placeHolder, null)
        }
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     */
    fun setImage(imageView: ImageView, url: String) {
        setImage(imageView, url, null)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     * @param callback 请求完毕回调
     */
    fun setImage(imageView: ImageView, url: String, callback: OnImageLoaderCallback?) {
        setImage(imageView, url, null, callback)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     * @param placeHolderResId 请求中挂载图资源id
     */
    fun setImage(imageView: ImageView, url: String, placeHolderResId: Int) {
        setImage(imageView, url, placeHolderResId, null)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     */
    fun setImage(imageView: ImageView, url: String, placeDrawable: Drawable) {
        setImage(imageView, url, placeDrawable, null)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     * @param placeHolderResId 请求中挂载图资源id
     * @param callback 请求完毕回调
     */
    fun setImage(imageView: ImageView, url: String, placeHolderResId: Int, callback: OnImageLoaderCallback?) {
        setImage(imageView, url, placeHolderResId, -1, callback)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     * @param placeHolder 请求中挂载图
     * @param callback 请求完毕回调
     */
    fun setImage(imageView: ImageView, url: String, placeHolder: Drawable?, callback: OnImageLoaderCallback?) {
        setImage(imageView, url, placeHolder, null, callback)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     * @param placeHolderResId 请求中挂载图资源id
     * @param errorDrawableResId 请求失败后错误图片资源id
     * @param callback 请求完毕回调
     */
    fun setImage(imageView: ImageView,
                 url: String,
                 placeHolderResId: Int,
                 errorDrawableResId: Int,
                 callback: OnImageLoaderCallback?) {
        var placeHolderDrawable: Drawable? = null
        if (placeHolderResId > 0) {
            try {
                placeHolderDrawable = imageView.context.resources.getDrawable(placeHolderResId)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
        var errorDrawable: Drawable? = null
        if (errorDrawableResId > 0) {
            try {
                errorDrawable = imageView.context.resources.getDrawable(errorDrawableResId)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
        setImage(imageView, url, placeHolderDrawable, errorDrawable, callback)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     * @param placeHolder 请求中挂载图
     * @param errorDrawable 请求失败图
     * @param callback 请求完毕回调
     */
    fun setImage(imageView: ImageView,
                 url: String,
                 placeHolder: Drawable?,
                 errorDrawable: Drawable?,
                 callback: OnImageLoaderCallback?) {
        setImage(imageView, url, DEFAULT_WIDTH, DEFAULT_HEIGHT, placeHolder, errorDrawable, callback)
    }

    /**
     * 设置图片给ImageView
     * @param imageView 图片控件
     * @param url 图片地址
     * @param width 预加载宽度
     * @param height 预加载高度
     * @param placeHolder 请求中挂载图
     * @param errorDrawable 请求失败图
     * @param callback 请求完毕回调
     */
    fun setImage(imageView: ImageView,
                 url: String,
                 width: Int,
                 height: Int,
                 placeHolder: Drawable?,
                 errorDrawable: Drawable?,
                 callback: OnImageLoaderCallback?) {
        imageEngine.setImage(
                imageView,
                url,
                width,
                height,
                placeHolder,
                errorDrawable,
                object : ImageEngine.OnImageEngineCallback {
                    override fun onImageAttachedComplete(imageView: ImageView, url: String, success: Boolean) {
                        callback?.onImageAttachedComplete(imageView, url, success)
                    }
                })
    }

    /**
     * 下载网络图片
     * @param context 生命周期管理
     * @param url 图片地址
     * @param path 本地保存地址
     * @param callback 请求完毕回调
     */
    fun loadImage(context: Context,
                  url: String,
                  path: String,
                  callback: OnImageLoaderCallback) {
        loadImage(context, url, path, DEFAULT_WIDTH, DEFAULT_HEIGHT, callback)
    }

    /**
     * 下载网络图片
     * @param context 生命周期管理
     * @param url 图片地址
     * @param path 本地保存地址
     * @param width 预加载宽度
     * @param height 预加载高度
     * @param callback 请求完毕回调
     */
    fun loadImage(context: Context,
                  url: String,
                  path: String,
                  width: Int,
                  height: Int,
                  callback: OnImageLoaderCallback) {
        imageEngine.loadImage(
                context,
                url,
                path,
                width,
                height,
                object : ImageEngine.OnImageEngineCallback {
                    override fun onImageLoadedComplete(path: String, url: String, success: Boolean) {
                        callback.onImageLoadedComplete(path, url, success)
                    }
                }
        )
    }

    interface OnImageLoaderCallback {
        /**
         * 图片设置到ImageView回调
         * @param imageView 图片控件
         * @param url 图片地址
         * @param success 是否请求成功
         */
        fun onImageAttachedComplete(imageView: ImageView, url: String, success: Boolean) {}

        /**
         * 网络图片下载回调
         * @param path 下载到本地到文件地址
         * @param url 网络图片地址
         * @param success 是否下载成功
         */
        fun onImageLoadedComplete(path: String, url: String, success: Boolean) {}
    }
}